﻿#include<iostream>
#include<vector>
#include"sort.h"
using namespace std;

//template<class T>
//class Less {
//public:
//	bool operator()(const T& x, const T& y) {
//		return x < y;
//	}
//};
//template<class T>
//class greater {
//public:
//	bool operator()(const T& x, const T& y) {
//		return x > y;
//	}
//};
//
//namespace xs {
//	template<class T, class Continer = vector<int>, class compare = Less<T>>
//	class pir_queue 
//	{
//	public:
//		//默认大堆
//		void adjustUp(int child)
//		{
//			compare com;
//			int parent = (child - 1) / 2;
//			while (child > 0) {
//				if (com(_con[parent], _con[child])) 
//				{
//					swap(_con[child], _con[parent]);
//					child = parent;
//					parent = (child - 1) / 2;
//				}
//				else 
//				{
//					break;
//				}
//			}
//		}
//
//		void adjustDown(int parent) 
//		{
//			compare com;
//			int child = parent * 2 + 1;
//			while (child < size()) 
//			{
//				if ( child + 1 < _con.size() && com(_con[child], _con[child + 1]))
//				{
//					++child;
//				}
//
//				if (com(_con[parent], _con[child])) 
//				{
//					swap(_con[child],_con[parent]);
//					parent = child;
//					child = parent * 2 + 1;
//
//				}
//				else
//				{
//					break;
//				}
//			}
//
//		}
//
//		void pop()
//		{
//			swap(_con[0], _con[_con.size() - 1]);
//			_con.pop_back();
//			adjustDown(0);
//		}
//
//		const T& top()
//		{
//			return _con[0];
//		}
//		void push(const T& x) {
//			_con.push_back(x);
//			adjustUp(_con.size()-1);
//		}
//
//		size_t size() {
//			return _con.size();
//		}
//
//		bool empty() const
//		{
//			return _con.empty();
//		}
//	private:
//		Continer _con;
//	};
//
//}
//
//
//	class person {
//	public:
//		string name;
//	};
//	class teacher:virtual public person {
//	protected:
//		int tel;
//	};
//	class student:virtual public person {
//	protected:
//		string _majorsource;
//	};
	/*class assistant:public student,public teacher{
	protected:

	};*/

void printArr(const int* a, size_t size) {
	for (int i = 0; i < size;i++) {
		cout << a[i] << " ";
	}
}
void test() {
	int arr[10] = {5,9,8,7,6,4,3,2,1,0};
	insertSort(arr,sizeof(arr)/sizeof(int));
	printArr(arr, sizeof(arr) / sizeof(int));

}

class A
{
public:
	virtual ~A()
	{
		cout << "~A()" << endl;
	}
};
class B : public A {
public:
	~B()
	{
		cout << "~B()->delete:" << _p << endl;
		delete _p;
	}
protected:
	int* _p = new int[10];
};

class Person {
public:
	virtual void BuyTicket() { cout << "买票-全价" << endl; }
	void printaddress() {
		cout << &a << endl;
	}
protected:
	int a;
};
class Student : public Person {
public:
	virtual void BuyTicket() { cout << "买票-打折" << endl; }
};
class Soldier : public Person {
public:
	virtual void BuyTicket() { cout << "买票-优先" << endl; }
};
void Func(Person* ptr)
{
	// 这⾥可以看到虽然都是Person指针Ptr在调⽤BuyTicket 
	// 但是跟ptr没关系，⽽是由ptr指向的对象决定的。 
	ptr->BuyTicket();
}
int main()
{
	// 其次多态不仅仅发⽣在派⽣类对象之间，多个派⽣类继承基类，重写虚函数后 
	// 多态也会发⽣在多个派⽣类之间。 
	Person ps;
	Student st;
	Soldier sr;
	ps.printaddress();
	st.printaddress();

    Func(&ps);
	Func(&st);
	Func(&sr);

	return 0;
}
